home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm2.lha / SORGENTI6 / LEZIONE10f1.s / LEZIONE10f1.s
Text File  |  1995-10-23  |  12KB  |  405 lines

  1.  
  2. ; Lezione10f1.s    Tanti BOB con sfondo "finto". C'e' un "errore" da sistemare!
  3. ;        Tasto sinistro per uscire.
  4.  
  5.     SECTION    bau,code
  6.  
  7. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  8.  
  9. *****************************************************************************
  10.     include    "startup1.s"    ; Salva Copperlist Etc.
  11. *****************************************************************************
  12.  
  13.         ;5432109876543210
  14. DMASET    EQU    %1000001111000000    ; copper,bitplane,blitter DMA
  15.  
  16.  
  17. ; costanti bordi.
  18.  
  19. Lowest_Floor    equ    200    ; bordo in basso
  20. Right_Side    equ    287    ; bordo a destra    
  21.  
  22.  
  23. START:
  24.  
  25. ; puntiamo i bitplanes
  26.     MOVE.L    #BITPLANE1,d0    ; dove puntare
  27.     LEA    BPLPOINTERS,A1    ; puntatori COP
  28.     MOVEQ    #3-1,D1        ; numero di bitplanes
  29. POINTBP:
  30.     move.w    d0,6(a1)
  31.     swap    d0
  32.     move.w    d0,2(a1)
  33.     swap    d0
  34.     ADD.L    #40*256,d0    ; + lunghezza bitplane (qua e' alto 256 linee)
  35.     addq.w    #8,a1
  36.     dbra    d1,POINTBP
  37.  
  38. ;    Puntiamo il quarto bitplane (lo sfondo)
  39.  
  40.     LEA    BPLPOINTERS,A0        ; puntatori COP
  41.     move.l    #SfondoFinto,d0        ; indirizzo sfondo
  42.     move.w    d0,30(a0)        ; lo sfondo e` il bitplane 4
  43.     swap    d0    
  44.     move.w    d0,26(a0)        ; scrivi word alta
  45.  
  46.     lea    $dff000,a5        ; CUSTOM REGISTER in a5
  47.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  48.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  49.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  50.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  51.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  52.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  53.  
  54. mouse:
  55.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  56.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  57. Waity1:
  58.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  59.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  60.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  61.     BNE.S    Waity1
  62.  
  63.     bsr.w    CancellaSchermo        ; cancella lo schermo
  64.  
  65.     lea    Oggetto_1,a4        ; indirizzo primo oggetto
  66.     moveq    #6-1,d6            ; 6 oggetti
  67.  
  68. Ogg_loop:
  69.     bsr.s    MuoviOggetto        ; muove il bob
  70.     bsr.w    DisegnaOggetto        ; disegna il bob
  71.  
  72.     addq.l    #8,a4            ; punta al prossimo oggetto
  73.  
  74.     dbra    d6,Ogg_loop
  75.  
  76.     btst    #6,2(a5)
  77. WBlit_coppermonitor:
  78.     btst    #6,2(a5)
  79.     bne.s    WBlit_coppermonitor
  80.  
  81.     move.w    #$aaa,$180(a5)        ; copper monitor: colore grigio
  82.  
  83.     btst    #6,$bfe001        ; tasto sinistro del mouse premuto?
  84.     bne.s    mouse            ; se no, torna a mouse:
  85.  
  86.     rts
  87.  
  88.  
  89. ;****************************************************************************
  90. ; Questa routine muove un bob controllando che non superi i bordi
  91. ; A4 - punta alla struttura dati che contiene la posizione e la velocita`
  92. ;      del bob
  93. ;****************************************************************************
  94.  
  95. MuoviOggetto:
  96.     move.w    (a4),d0            ; posizione X
  97.     move.w    2(a4),d1        ; posizione Y
  98.     move.w    4(a4),d2        ; dx (velocita` X)
  99.     move.w    6(a4),d3        ; dy (velocita` Y)
  100.     add.w    d2,d0            ; x = x + dx
  101.     add.w    d3,d1            ; y = y + dy
  102.  
  103.     btst    #15,d1            ; controlla bordo alto (Y=0)
  104.     beq.s    UO_NoBounce4        ; se la Y e` negativa...
  105.     neg.w    d1            ; .. fa il rimbalzo
  106.     neg.w    d3            ; inverti direzione del moto
  107. UO_NoBounce4:
  108.  
  109.     cmp.w    #Lowest_Floor,d1    ; controlla bordo in basso
  110.     blt.s    UO_NoBounce1
  111.  
  112.     neg.w    d3            ; cambia il segno della velocita` dy
  113.                     ; invertendo la direzione del moto
  114.     move.w    #Lowest_Floor,d1    ; riparti dal bordo
  115. UO_NoBounce1:
  116.  
  117.     cmp.w    #Right_Side,d0        ; controlla bordo destro
  118.     blt.s    UO_NoBounce2        ; se supera il bordo destro..
  119.     sub.w    #Right_Side,d0        ; distanza dal bordo
  120.     neg.w    d0            ; inverti la distanza
  121.     add.w    #Right_Side,d0        ; aggiungi coordinata bordo
  122.     neg.w    d2            ; inverti direzione del moto
  123. UO_NoBounce2:
  124.     btst    #15,d0            ; controlla bordo sinistro (X=0)
  125.     beq.s    UO_NoBounce3        ; se la X e` negativa...
  126.     neg.w    d0            ; .. fa il rimbalzo
  127.     neg.w    d2            ; inverti direzione del moto
  128. UO_NoBounce3:
  129.     move.w    d0,(a4)            ; aggiorna posizione e velocita`
  130.     move.w    d1,2(a4)
  131.     move.w    d2,4(a4)
  132.     move.w    d3,6(a4)
  133.  
  134.     rts
  135.  
  136.  
  137. ;****************************************************************************
  138. ; Questa routine disegna un BOB.
  139. ; A4 - punta alla struttura dati che contiene la posizione e la velocita`
  140. ;      del bob
  141. ;****************************************************************************
  142.  
  143. ;            |\__/,|   (`\
  144. ;          _.|o o  |_   ) )
  145. ;      ---(((---(((---------
  146.  
  147. DisegnaOggetto:
  148.     lea    BITPLANE1,a0    ; indirizzo bitplane
  149.     move.w    2(a4),d0    ; coordinata Y
  150.     mulu.w    #40,d0        ; calcola indirizzo: ogni riga occupa 40 bytes
  151.  
  152.     add.l    d0,a0        ; aggiungi offset Y
  153.  
  154.     move.w    (a4),d0        ; coordinata X
  155.     move.w    d0,d1        ; copia
  156.     and.w    #$000f,d0    ; si selezionano i primi 4 bit perche' vanno
  157.                 ; inseriti nello shifter del canale A 
  158.     lsl.w    #8,d0        ; i 4 bit vengono spostati sul nibble alto
  159.     lsl.w    #4,d0        ; della word...
  160.     or.w    #$0FCA,d0    ; ...giusti per inserirsi nel registro BLTCON0
  161.     lsr.w    #3,d1        ; (equivalente ad una divisione per 8)
  162.                 ; arrotonda ai multipli di 8 per il puntatore
  163.                 ; allo schermo, ovvero agli indirizzi dispari
  164.                 ; (anche ai byte, quindi)
  165.                 ; x es.: un 16 come coordinata diventa il
  166.                 ; byte 2 
  167.     and.l    #$0000fffe,d1    ; escludo il bit 0 del
  168.     add.l    d1,a0        ; aggiungi l'offset X, trovando l'indirizzo
  169.                 ; della destinazione
  170.  
  171.     lea    Ball_Bob,a1        ; puntatore alla figura
  172.     lea    Ball_Mask,a2        ; puntatore alla maschera
  173.     moveq    #3-1,d7            ; bitplane counter
  174.  
  175. DrawLoop:
  176.     btst    #6,2(a5)
  177. WBlit2:
  178.     btst    #6,2(a5)
  179.     bne.s    WBlit2
  180.  
  181.     move.w    d0,$40(a5)        ; BLTCON0 - scrivi valore di shift
  182.     move.w    d0,d1            ; copia valore di BLTCON0,
  183.     and.w    #$f000,d1        ; seleziona valore di shift..
  184.     move.w    d1,$42(a5)        ; e scrivilo in BLTCON1 (per canale B)
  185.  
  186.     move.l    #$ffff0000,$44(a5)    ; BLTAFWM e BLTLWM
  187.  
  188.     move.w    #$FFFE,$64(a5)        ; BLTAMOD
  189.     move.w    #$FFFE,$62(a5)        ; BLTBMOD
  190.  
  191.     move.w    #40-6,$66(a5)        ; BLTDMOD
  192.     move.w    #40-6,$60(a5)        ; BLTCMOD
  193.  
  194.     move.l    a2,$50(a5)        ; BLTAPT - puntatore maschera
  195.     move.l    a1,$4c(a5)        ; BLTBPT - puntatore figura
  196.     move.l    a0,$48(a5)        ; BLTCPT - puntatore sfondo
  197.     move.l    a0,$54(a5)        ; BLTDPT - puntatore bitplanes
  198.  
  199.     move.w    #(31*64)+3,$58(a5)    ; BLTSIZE - altezza 31 linee
  200.                      ; largh. 3 word (48 pixel).
  201.  
  202.     add.l    #4*31,a1        ; indirizzo prossimo plane immagine
  203.     add.l    #40*256,a0        ; indirizzo prossimo plane destinazione
  204.     dbra    d7,DrawLoop
  205.  
  206.  
  207.  
  208.     rts
  209.  
  210.  
  211. ;****************************************************************************
  212. ; Questa routine cancella lo schermo mediante il blitter.
  213. ;****************************************************************************
  214.  
  215. CancellaSchermo:
  216.     moveq    #3-1,d7            ; 3 bitplanes
  217.     lea    BITPLANE1,a0        ; indirizzo schermo
  218.  
  219. canc_loop:
  220.     btst    #6,2(a5)
  221. WBlit3:
  222.     btst    #6,2(a5)         ; attendi che il blitter abbia finito
  223.     bne.s    wblit3
  224.  
  225.     move.l    #$01000000,$40(a5)    ; BLTCON0 e BLTCON1: Cancella
  226.     move    #$0000,$66(a5)        ; BLTDMOD=0
  227.     move.l    a0,$54(a5)        ; BLTDPT
  228.     move.w    #(64*256)+20,$58(a5)    ; BLTSIZE (via al blitter !)
  229.                     ; cancella tutto lo schermo
  230.  
  231.     add.l    #40*256,a0        ; indirizzo prossimo plane destinazione
  232.     dbra    d7,canc_loop
  233.     rts
  234.  
  235.  
  236. ; dati oggetti
  237. ; queste sono le strutture dati che contengono velocita` e posizione dei bobs.
  238. ; ogni struttra dati si compone di 4 words che contengono nell'ordine:
  239. ; POSIZIONE X, POSIZIONE Y, VELOCITA` X, VELOCITA` Y
  240.  
  241. Oggetto_1:
  242.     dc.w    32,53        ;  x / y   - posizione
  243.     dc.w    -3,1        ; dx / dy  - velocita`
  244.  
  245. Oggetto_2:
  246.     dc.w    132,62        ;  x / y   - posizione
  247.     dc.w    2,-1        ; dx / dy  - velocita`
  248.  
  249. Oggetto_3:
  250.     dc.w    232,42        ;  x / y   - posizione
  251.     dc.w    3,1        ; dx / dy  - velocita`
  252.  
  253. Oggetto_4:
  254.     dc.w    2,20        ;  x / y   - posizione
  255.     dc.w    -5,1        ; dx / dy  - velocita`
  256.  
  257. Oggetto_5:
  258.     dc.w    60,80        ;  x / y   - posizione
  259.     dc.w    6,1        ; dx / dy  - velocita`
  260.  
  261. Oggetto_6:
  262.     dc.w    50,75        ;  x / y   - posizione
  263.     dc.w    -5,1        ; dx / dy  - velocita`
  264.  
  265. ;****************************************************************************
  266.  
  267.     SECTION    MY_COPPER,CODE_C
  268.  
  269. COPPERLIST:
  270.     dc.w    $8E,$2c81    ; DiwStrt
  271.     dc.w    $90,$2cc1    ; DiwStop
  272.     dc.w    $92,$38        ; DdfStart
  273.     dc.w    $94,$d0        ; DdfStop
  274.     dc.w    $102,0        ; BplCon1
  275.     dc.w    $104,0        ; BplCon2
  276.  
  277.     dc.w    $108,0        ; MODULO
  278.     dc.w    $10a,0
  279.  
  280. BPLPOINTERS:
  281.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  282.     dc.w $e4,$0000,$e6,$0000
  283.     dc.w $e8,$0000,$ea,$0000
  284.     dc.w $ec,$0000,$ee,$0000
  285.  
  286.     dc.w    $180,$000    ; color0 - sfondo
  287.     dc.w    $190,$000
  288.  
  289.      dc.w    $182,$0A0            ; colori da 1 a 7
  290.      dc.w    $184,$040
  291.      dc.w    $186,$050
  292.      dc.w    $188,$061
  293.      dc.w    $18A,$081
  294.      dc.w    $18C,$020
  295.      dc.w    $18E,$6F8
  296.  
  297.     dc.w    $192,$0A0        ; colori da 9 a 15
  298.     dc.w    $194,$040        ; sono gli stessi valori
  299.     dc.w    $196,$050        ; caricati nei registri da 1 a 7
  300.     dc.w    $198,$061
  301.     dc.w    $19a,$081
  302.     dc.w    $19c,$020
  303.     dc.w    $19e,$6F8
  304.  
  305.     dc.w    $190,$345    ; colore 8 - pixel ad 1 dello sfondo
  306.  
  307.     dc.w    $100,$3200    ; bplcon0 - 3 bitplanes lowres
  308.  
  309.     dc.w    $8007,$fffe    ; aspetta riga $80
  310.     dc.w    $100,$4200    ; bplcon0 - 4 bitplanes lowres
  311.                 ; attiva il bitplane 4 (sfondo)
  312.  
  313. ; in questo spazio e' visualizzata la parte dello sfondo
  314.  
  315.     dc.w    $e007,$fffe    ; aspetta riga $e0
  316.     dc.w    $100,$3200    ; bplcon0 - 3 bitplanes lowres
  317.  
  318.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  319.  
  320. ;****************************************************************************
  321.  
  322. ; Figura Bob
  323. Ball_Bob:
  324.  DC.W $0000,$0000,$0000,$0000,$0000,$0000,$003F,$8000    ; plane 1
  325.  DC.W $00C1,$E000,$017C,$E000,$02FE,$3000,$05FF,$5400
  326.  DC.W $07FF,$1800,$0BFE,$AC00,$03FF,$1A00,$0BFE,$AC00
  327.  DC.W $11FF,$1A00,$197D,$2C00,$0EAA,$1A00,$1454,$DC00
  328.  DC.W $0E81,$3800,$0154,$F400,$02EB,$F000,$015F,$D000
  329.  DC.W $00B5,$A000,$002A,$8000,$0000,$0000,$0000,$0000
  330.  DC.W $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
  331.  DC.W $0000,$0000,$0000,$0000,$0000,$0000
  332.  
  333.  DC.W $000F,$E000,$007F,$FC00,$01FF,$FF00,$03FF,$FF80    ; plane 2
  334.  DC.W $07C1,$FFC0,$0F00,$FFE0,$1E00,$3FF0,$3C40,$5FF8
  335.  DC.W $3CE0,$1FF8,$7840,$2FFC,$7800,$1FFC,$7800,$2FFC
  336.  DC.W $F800,$1FFE,$F800,$2FFE,$FE00,$1FFE,$FC00,$DFFE
  337.  DC.W $FE81,$3FFE,$FF54,$FFFE,$FFEB,$FFFE,$7FFF,$FFFC
  338.  DC.W $7FFF,$FFFC,$7FFF,$FFFC,$3FFF,$FFF8,$3FFF,$FFF8
  339.  DC.W $1FFF,$FFF0,$0FFF,$FFE0,$07FF,$FFC0,$03FF,$FF80
  340.  DC.W $01FF,$FF00,$007F,$FC00,$000F,$E000
  341.  
  342.  DC.W $000F,$E000,$007F,$FC00,$01E0,$7F00,$0380,$0F80    ; plane 3
  343.  DC.W $073E,$0AC0,$0CFF,$0560,$198F,$C2F0,$3347,$A0B8
  344.  DC.W $32EB,$E158,$6647,$D0AC,$660B,$E05C,$4757,$D0AC
  345.  DC.W $C7AF,$E05E,$A7FF,$D02E,$C1FF,$E05E,$A3FF,$202E
  346.  DC.W $D17E,$C05E,$E0AB,$002E,$D014,$005E,$6800,$00AC
  347.  DC.W $7000,$02DC,$7400,$057C,$2800,$0AF8,$3680,$55F8
  348.  DC.W $1D54,$AAF0,$0EAB,$55E0,$0754,$ABC0,$03EB,$FF80
  349.  DC.W $01FE,$FF00,$007F,$FC00,$000F,$E000
  350.  
  351. ; Maschera Bob
  352. Ball_MASK:
  353.  DC.W $000F,$E000,$007F,$FC00,$01FF,$FF00,$03FF,$FF80
  354.  DC.W $07FF,$FFC0,$0FFF,$FFE0,$1FFF,$FFF0,$3FFF,$FFF8
  355.  DC.W $3FFF,$FFF8,$7FFF,$FFFC,$7FFF,$FFFC,$7FFF,$FFFC
  356.  DC.W $FFFF,$FFFE,$FFFF,$FFFE,$FFFF,$FFFE,$FFFF,$FFFE
  357.  DC.W $FFFF,$FFFE,$FFFF,$FFFE,$FFFF,$FFFE,$7FFF,$FFFC
  358.  DC.W $7FFF,$FFFC,$7FFF,$FFFC,$3FFF,$FFF8,$3FFF,$FFF8
  359.  DC.W $1FFF,$FFF0,$0FFF,$FFE0,$07FF,$FFC0,$03FF,$FF80
  360.  DC.W $01FF,$FF00,$007F,$FC00,$000F,$E000
  361.  
  362.  
  363. ;****************************************************************************
  364.  
  365. ; Sfondo 320 * 100 1 Bitplane, raw normale.
  366.  
  367. SfondoFinto:
  368.     incbin    "sfondo320*100.raw"
  369.  
  370. ;****************************************************************************
  371.  
  372.     SECTION    bitplane,BSS_C
  373. BITPLANE1:
  374.     ds.b    40*256
  375. BITPLANE2:
  376.     ds.b    40*256
  377. BITPLANE3:
  378.     ds.b    40*256
  379.  
  380.     end
  381.  
  382. ;****************************************************************************
  383.  
  384. In questo esempio vediamo 6 bob che si muovono su uno sfondo.
  385. Utilizziamo il trucco dello sfondo finto. Siccome pero` i 6 bobs sono disegnati
  386. tutti negli stessi planes, dobbiamo comunque blittarli usando la tecnica
  387. del bitplane maschera e del "cookie cut", altrimenti non si sovrapporrebbero
  388. correttamente. La tecnica dello sfondo finto ci consente tuttavia di evitare
  389. il salvataggio ed il ripristino dello sfondo, visto che lo sfondo e` formato
  390. da soli zeri. Per cancellare i bobs disegnati nelle vecchie posizioni e` 
  391. suffincente quindi cancellare i planes dedicati ai bobs prima di iniziare 
  392. a ridisegnarli.
  393. Per muovere e disegnare i bobs usiamo delle routines parametriche che sono
  394. in grado di gestire tutti i bobs che vogliamo. Invece di passare i parametri
  395. attraverso i registri della CPU, usiamo delle "strutture dati", ovverosia
  396. raccogliamo in indirizzi contigui i dati di velocita` e posizione di ogni bob,
  397. seguendo sempre lo stesso ordine. Alle routine viene "passato" attraverso il 
  398. registro A4 l'indirizzo della struttura dati. In questo modo le routine
  399. sanno che i dati del bob si trovano all'indirizzo puntato da A4 e agli
  400. indirizzi successivi.
  401. Questo programma come potete vedere eseguendolo, non disegna correttamente
  402. i bobs. Per la spiegazione del problema e per la soluzione consultate la
  403. lezione.
  404.  
  405.